using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace CSharpPro._1016;
 // 作业7：用户登录与注册主入口
public class User
{
    // 用户属性
    public string Username { get; set; }
    public string Password { get; set; }

    // 存储所有用户的集合（预先添加固定用户）
    private static List<User> _users = new List<User>
    {
        new User { Username = "zyl", Password = "zyl20060903" } // 固定用户
    };
    public void RunUserSystem()
    {
        bool isRunning = true;
        while (isRunning)
        {
            ShowMainMenu();
            string choice = Console.ReadLine()?.Trim() ?? string.Empty;

            switch (choice)
            {
                case "1":
                    Login();
                    break;
                case "2":
                    Register();
                    break;
                case "3":
                    isRunning = false;
                    Console.WriteLine("系统已退出，感谢使用！");
                    break;
                default:
                    Console.WriteLine("请输入有效数字（1-3）");
                    WaitForKey();
                    break;
            }
        }
    }

    // 显示主菜单
    private void ShowMainMenu()
    {
        Console.Clear();
        Console.WriteLine("===== 用户系统 =====");
        Console.WriteLine("1. 登录");
        Console.WriteLine("2. 注册");
        Console.WriteLine("3. 退出");
        Console.Write("请选择功能（1-3）：");
    }

    // 注册功能
    private void Register()
    {
        Console.Clear();
        Console.WriteLine("===== 用户注册 =====");

        // 获取并验证用户名
        string username = GetValidUsername();
        if (string.IsNullOrEmpty(username))
        {
            WaitForKey();
            return;
        }

        // 获取并验证密码
        string password = GetValidPassword();
        if (string.IsNullOrEmpty(password))
        {
            WaitForKey();
            return;
        }

        // 确认密码
        if (!ConfirmPassword(password))
        {
            WaitForKey();
            return;
        }

        // 注册成功
        _users.Add(new User { Username = username, Password = password });
        Console.WriteLine("注册成功！即将返回主菜单...");
        WaitForKey();
    }

    // 验证用户名
    private string GetValidUsername()
    {
        while (true)
        {
            Console.Write("请输入用户名（3-15个字符，含字母、数字、下划线）：");
            string username = Console.ReadLine()?.Trim() ?? string.Empty;

            // 空值校验
            if (string.IsNullOrEmpty(username))
            {
                Console.WriteLine("用户名不可为空");
                continue;
            }

            // 长度校验
            if (username.Length < 3 || username.Length > 15)
            {
                Console.WriteLine("用户名长度必须为3-15个字符");
                continue;
            }

            // 字符校验
            if (!Regex.IsMatch(username, @"^[a-zA-Z0-9_]+$"))
            {
                Console.WriteLine("用户名只能包含字母、数字和下划线");
                continue;
            }

            // 唯一性校验
            if (_users.Exists(u => u.Username == username))
            {
                Console.WriteLine("用户名已存在，请更换");
                continue;
            }

            return username;
        }
    }

    // 验证密码
    private string GetValidPassword()
    {
        while (true)
        {
            Console.Write("请输入密码（6-20个字符，含大小写字母和数字）：");
            string password = Console.ReadLine() ?? string.Empty;

            // 空值校验
            if (string.IsNullOrEmpty(password))
            {
                Console.WriteLine("密码不可为空");
                continue;
            }

            // 长度校验
            if (password.Length < 6 || password.Length > 20)
            {
                Console.WriteLine("密码长度必须为6-20个字符");
                continue;
            }

            // 复杂度校验
            bool hasUpper = Regex.IsMatch(password, @"[A-Z]");
            bool hasLower = Regex.IsMatch(password, @"[a-z]");
            bool hasDigit = Regex.IsMatch(password, @"[0-9]");

            if (!hasUpper || !hasLower || !hasDigit)
            {
                Console.WriteLine("密码必须包含至少1个大写字母、1个小写字母和1个数字");
                continue;
            }

            return password;
        }
    }

    // 确认密码
    private bool ConfirmPassword(string password)
    {
        while (true)
        {
            Console.Write("请确认密码：");
            string confirm = Console.ReadLine() ?? string.Empty;

            if (confirm != password)
            {
                Console.WriteLine("两次输入的密码不一致，请重新输入");
                continue;
            }

            return true;
        }
    }

    // 登录功能
    private void Login()
    {
        Console.Clear();
        Console.WriteLine("===== 用户登录 =====");

        Console.Write("请输入用户名：");
        string username = Console.ReadLine()?.Trim() ?? string.Empty;

        Console.Write("请输入密码：");
        string password = Console.ReadLine() ?? string.Empty;

        // 验证用户是否存在
        var user = _users.Find(u => u.Username == username);
        if (user == null)
        {
            Console.WriteLine("登录失败：用户名不存在");
            WaitForKey();
            return;
        }

        // 验证密码
        if (user.Password != password)
        {
            Console.WriteLine("登录失败：密码错误");
            WaitForKey();
            return;
        }

        // 登录成功
        Console.WriteLine($"登录成功！欢迎您，{username}！");
        Console.WriteLine("已进入系统首页（模拟）");
        WaitForKey();
    }

    // 等待用户按键
    private void WaitForKey()
    {
        Console.WriteLine("按任意键继续...");
        Console.ReadKey();
    }
}